/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estructurassa.expertos;

import estructurassa.entidades.DetalleOrden;
import estructurassa.entidades.EtapaFabricacion;
import estructurassa.entidades.OrdenDeProduccion;
import estructurassa.entidades.Trabajador;
import estructurassa.expertos.excepciones.ABMTrabajadorException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import org.hibernate.Criteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import persistencia.Conexion;
import persistencia.Fachada;
import persistencia.exceptions.ExcepcionFachada;

/**
 *
 * @author Juan
 */
public class ExpertoABMTrabajador implements Experto {

    public List buscarCategoriaEmpleado() {
        return ((ExpertoABMCategoriaTrabajador) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_CATEGORIA_TRABAJADOR)).buscarCategorias();
    }

    public void guardar(Trabajador trabajador) throws ABMTrabajadorException {
        validarTrabajador(trabajador);
        validarExistencia(trabajador);

        try {
            Conexion.getInstancia().iniciarTX();
            Fachada.getInstancia().guardar(trabajador);
            Conexion.getInstancia().confirmarTx();
        } catch (ExcepcionFachada ex) {
            Conexion.getInstancia().deshacerTx();
            Logger.getLogger(ExpertoABMMaterial.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public void modificar(Trabajador trabajador) throws ABMTrabajadorException {
        validarTrabajador(trabajador);


        try {
            Conexion.getInstancia().iniciarTX();
            Fachada.getInstancia().guardar(trabajador);
            Conexion.getInstancia().confirmarTx();
        } catch (ExcepcionFachada ex) {
            Conexion.getInstancia().deshacerTx();
            Logger.getLogger(ExpertoABMMaterial.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public List buscarTrabajador() {
        return Fachada.getInstancia().buscar(Trabajador.class, null);
    }

    public List buscarTrabajador(String dni, String apellido, String nombre, String legajo) {
        Criteria criterioNombre = Fachada.getInstancia().crearCriterio(Trabajador.class);
        if (!"".equals(nombre)) {
            criterioNombre.add(Restrictions.eq("dni", dni));
        }
        if (!"".equals(nombre)) {
            criterioNombre.add(Restrictions.ilike("apellido", apellido, MatchMode.ANYWHERE));
        }
        if (!"".equals(nombre)) {
            criterioNombre.add(Restrictions.ilike("nombre", nombre, MatchMode.ANYWHERE));
        }
        if (!"".equals(nombre)) {
            criterioNombre.add(Restrictions.eq("legajo", legajo));
        }

        return Fachada.getInstancia().buscar(Trabajador.class, criterioNombre);
    }

    private void validarTrabajador(Trabajador trabajador) throws ABMTrabajadorException {
        if (trabajador.getNombre().length() == 0) {
            throw new ABMTrabajadorException("Falta nombre");
        }
        if (trabajador.getApellido().length() == 0) {
            throw new ABMTrabajadorException("Falta apellido");
        }
        if (trabajador.getDni().length() == 0) {
            throw new ABMTrabajadorException("Falta dni");
        }
        if (trabajador.getTipoDNI().length() == 0) {
            throw new ABMTrabajadorException("Falta Tipo de DNI");
        }

    }

    private void validarExistencia(Trabajador trabajador) throws ABMTrabajadorException {
        Criteria legajoTrabajador = Fachada.getInstancia().crearCriterio(Trabajador.class);
        legajoTrabajador.add(Restrictions.eq("legajo", trabajador.getLegajo()));
        if (!Fachada.getInstancia().buscar(Trabajador.class, legajoTrabajador).isEmpty()) {
            throw new ABMTrabajadorException("Trabajador ya existente");
        }
    }

    public void darDeBaja(Trabajador trabajadorSeleccionado) throws ABMTrabajadorException, ExcepcionFachada {
        boolean encontrado = false;
        Criteria criterioOrdenActiva = Fachada.getInstancia().crearCriterio(OrdenDeProduccion.class);
        criterioOrdenActiva.add(Restrictions.eq("ordenActiva", true));
        List ordenesActivas = Fachada.getInstancia().buscar(OrdenDeProduccion.class, criterioOrdenActiva);

        throw new ABMTrabajadorException("Cambiar el metodo dar de baja trabajador!!!!!!!");
        /**
         * Las etapas de fabricación son por categoria de trabajadores y no trabajador individual
         * 
         */
        
        
//        if (!encontrado) {
//            Fachada.getInstancia().eliminar(trabajadorSeleccionado);
//        } else {
//            JOptionPane.showMessageDialog(null, "Empleado trabajando actualmente en una orden pendiente", "Notificación", JOptionPane.INFORMATION_MESSAGE);
//            throw new ABMTrabajadorException("No se pudo eliminar el trabajador");
//        }



    }
}
